import path from 'path';

import { ComponentResolver } from '../unplugin-vue-components/types';
import { PlatformSplitChar, walkSync } from './utils';

/**
 *
 * 存在一个潜在问题：
 *
 * components中的子组件，如：components/Table/src/components/*.vue
 * 这些子组件部分会在根级中(index.ts)中export, 还有一部分 不会export, 现在是统一扫描并且视为index.ts中export,所以在需要单独使用这部分子组件时可能会出现找不到的情况
 * 这个时候，就需要修改index.ts，将其export
 *
 */

//自定义组件前缀
const prefix = 'G';
//已扫描的 组件名:组件文件位置
const primitiveComponentNames: { [key: string]: { as?: string; from: string; name?: string } } = {};
//扫描的组件路径
const prefixComponentPath = path.resolve(process.cwd(), `src${PlatformSplitChar}components`);

//开始扫描组件
walkSync(prefixComponentPath, ['.vue'], function (filePath: string) {
  const names = filePath.split(PlatformSplitChar);
  //GButton
  const fileName = names[names.length - 1].split('.')[0];
  const componentName: string = prefix + fileName;

  const from = filePath.split(`${PlatformSplitChar}src${PlatformSplitChar}`);
  from.splice(0, 1);
  if (from[0].startsWith('components/')) {
    from[0] = from[0].replace('components/', '');
  }

  /**
   * from : 组件文件位置
   * as: 别名，生成d.ts中的key, GButton
   * name:组件实际名称  ,Button
   *
   * 实际情况:  项目中自定义组件统一使用 `g`前缀，g-button
   * 但import时：是import Button from 'xxxxx', d.ts中也是GButton
   */

  const info = {
    from: `${prefixComponentPath}/${from[0].split(PlatformSplitChar).join('/')}`,
    as: componentName,
    name: fileName,
  };

  //路径中至少有一个src
  //路径中没有第二个src
  // if (from.match(/\/src\//gi)?.length == 1) {
  //   info.name = fileName;
  //   const dirNames = from.split('/');
  //   info.from = `/@/components/${dirNames[dirNames.length - 1]}`;
  //   //如果src>1,说明是 /src/..../src/.../src/...
  // }
  primitiveComponentNames[componentName] = info;

  // console.log(componentName + ' ------->  ' + info.from);
});

// 是否src/components下的组件
function isGllComponent(compName: string): boolean {
  return !!primitiveComponentNames[compName] || false;
}

// 自定义组件导入
export function GllComponentResolver(): ComponentResolver {
  return {
    type: 'component',
    resolve: (name) => {
      if (isGllComponent(name)) {
        // const importName = name.slice(1);
        // console.log(`import ${name} from ${primitiveNames[name]}`);
        /**
         *
         * 两种用法
         * 1. 加name: 指定组件名， import { Button } from 'xxx'
         * 2. 不加name: import Button from 'xxx'
         */
        return primitiveComponentNames[name];
      }
    },
  };
}
